<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    //假设每个人做作业：
    function doWork(name){ //只要这个doWork执行，就会返回下面的内容 doWork接收一个参数name，函数done可以拿到这个参数，done就是之前的resolve

        //return返回一个promise对象 promise对象接收一个参数回调函数（即这里的箭头函数） 回调函数接收了一个参数done（即resolve）
        return new Promise((done) => { //这个对象当中的函数会在两秒之内将状态改成done
            setTimeout(function (){
                console.log(name,"done") //打印执行doWork函数的那个参数的参数名
                done(name) //后续的then会监听这个done，只要执行完成了done，下一次就会执行then，then里面可以接收来自done里面的参数
            },Math.random()*2000)
        })
    }

    //如果有100人做这个作业，该在什么时候收这个作业？
    let arr = []

    for(let i = 0;i < 100;i++){
        arr.push(doWork(i)) //for循环为每一个i执行doWork函数，并且将doWork函数的执行返回结果添加到数组arr中
    }

    //随后Promise.all方法接收该数组
    Promise.all(arr) //Promise.all接收的实参arr数组 是每次函数doWork执行后 每个被返回的promise对象所形成的集合 后面的then也可以拿到
        .then(data=>{ //在promise.all中 then的执行条件是 上面数组中所有的promise对象都触发了done（即我们说的resolve） then才会执行
            console.log(data)
            console.log("全部搞定")
        })

    //这时候就需要用一个方法 Promise.all方法
    //Promise.all 接收一个数组，数组里面放若干个 promise对象，只有所有的promise都resolve（这里是done了） 才会触发下一步的then
    //then方法在这里的形参data 接收的实参是来自于Promise.all所接收的数组，这个接收的数组是原promise对象数组中每一项执行后得出的结果
</script>
</body>
</html>